package E.哈希表;

import java.util.HashSet;
import java.util.Set;

/**自己不会了
 *
 *
 */

public class _202_快乐数 {

    /**题解：可以把这道题理解为一个链表 下一个节点存的就是本节点的结果 过程只要分为一下情况：
     * 1.一个一个直到1
     * 2，循环到之前计算过的一个数字 即形成环型链表
     * 3.不断变大（每一位最大数字的下一位总结验证 可得最终只会在243以下进行运算）
     *
     * 因此这个问题就变成了判断这个数字链表有没有环的问题--类比于141题环形链表
     * 解法1：将每次计算的结果放在set里 只要结果不为1 并且set不含该元素 就一直添加元素
     *
     * @param n
     * @return
     */
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while (n != 1 && !set.contains(n)){
            set.add(n);
            n = getnext(n);
        }
        return n==1;//n为1时返回true

    }

    //解法2-龟兔赛跑快慢指针 之前的节点相等问题转化为数值相等
    public boolean isHappy1(int n) {

        int slow =0;
        int fast =getnext(n);
        while (fast != 1 && fast !=slow){
            slow = getnext(slow);
            fast = getnext(getnext((fast)));
        }

        return fast ==1;
    }
    public int getnext(int n){
        int total=0;
        while (n>0){
            int temp = n % 10;
            total += temp *temp;
            n /= 10;
        }
        return total;
    }


}
